#include <bits/stdc++.h>
#define IOS ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
using namespace std;
typedef long long ll;
const int N=1e5+10; 
struct node1{
	int x,y; 
	ll z;
}e[N];
struct node{
	int to,next;
}edge[N<<2];
int n,m,head[N<<1],tot,num; 
int dep[N<<1],f[N<<1],fa[N<<1][20];
ll val[N<<1];
ll a[N];
ll sum[N<<1];
ll maxcost[N<<1][20];
bool vis[N<<1];
void add(int from,int to)
{
	edge[++tot].to=to;
	edge[tot].next=head[from];
	head[from]=tot;
}
bool cmp(node1 a,node1 b)
{
	return a.z<b.z;
}
int find(int x)
{
	if(f[x]==x)return x;
	return f[x]=find(f[x]);
}
void kruskal()
{
	sort(e+1,e+m+1,cmp);
	for(int i=1;i<=2*n;i++)f[i]=i;
	for(int i=1;i<=m;i++)
	{
		int x=find(e[i].x);
		int y=find(e[i].y);
		if(x!=y)
		{
			++num;
			f[x]=f[y]=f[num]=num;
			val[num]=e[i].z;
			add(num,x);
			add(num,y);			
		}
	}
}
void dfs1(int u){
    vis[u]=1;
	sum[u]+=a[u];
	for(int i=head[u];i;i=edge[i].next){
		int v=edge[i].to;
		fa[v][0]=u;
		dfs1(v);
		sum[u]+=sum[v];
	}
}
void dfs2(int u){
	maxcost[u][0]=val[fa[u][0]]-sum[u];
	for(int k=1;k<=19;k++){
		fa[u][k]=fa[fa[u][k-1]][k-1];
		maxcost[u][k]=max(maxcost[u][k-1],maxcost[fa[u][k-1]][k-1]);
	}
	for(int i=head[u];i;i=edge[i].next){
		int v=edge[i].to;
		dfs2(v);
	}
}


ll query(int x,ll v)
{
	for(int i=19;i>=0;i--)
	{
		if(fa[x][i] && maxcost[x][i]<=v) x=fa[x][i];
	}
	return sum[x]+v;
}
int main()
{
	IOS;
	int q;
	cin>>n>>m>>q;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=1;i<=m;i++) cin>>e[i].x>>e[i].y>>e[i].z;
	num=n;
	kruskal();
	
	for(int i=num;i>n;i--)
	{
		if(!vis[i])
		{
			dep[i]=1;
			fa[i][0]=i;
			dfs1(i);		
			dfs2(i);	
		}
	}
	while(q--)
	{
		int x;
		ll v;
		cin>>x>>v;
		cout<<query(x,v)<<'\n';
	}
	return 0;
}
